'''
Created on 02/06/2014

@author: Vitor, Monique
'''

'''
Algoritmo encontrado em: http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html

camadas = vetor que mostra quantos neuronios tem em cada camada
'''
def backPropagation(vetorEntradas, yDesejado, camadas, matriz3Omegas,  matrizTetas, f, tol = 0.1, passo = 0.1):
    tamEntradas = len(vetorEntradas)
    numCamadas = len(camadas)
    listaErros = []
    erro = 5
    it = 0
    matrizY = [None]*numCamadas
    matrizErros = [None]*numCamadas
    
    while it < 10000 and erro < tol:
        erro = 0
        for i in range(tamEntradas):
            yEncontrado = calculaY(vetorEntradas[i], matrizY, camadas, 0, matriz3Omegas, matrizTetas, f)
            erroAtual = yDesejado[i] - yEncontrado
            
            matrizErros = calculaErros(erroAtual, matrizErros, camadas, numCamadas-1, matriz3Omegas)
            
            matrizDeltas = calculaDeltas()
            
            atualizaPesos()
            
            erro += erroAtual
        
        #para fazer curva de aprendizado
        listaErros.append(erro)
    
    return matriz3Omegas, matrizTetas, listaErros


'''
matrizY = matriz de Y da computação para frente
'''
def calculaY(vetorEntradaI, matrizY, camadas, camadaAtual, omegas, tetas, f):
    for i in range(camadas[camadaAtual]):
        matrizY[camadaAtual].append(tetas[camadaAtual][i])
    
    for i in range(len(vetorEntradaI)):
        for j in range(camadas[camadaAtual]):
            matrizY[camadaAtual][j] += vetorEntradaI[i]*omegas[camadaAtual][i][j]

    if camadaAtual == (len(camadas)-1):
        return matrizY[camadaAtual][0]
    
    return calculaY(matrizY[camadaAtual], matrizY, camadas, camadaAtual+1, omegas, tetas, f)

def calculaErros(erroAtual, matrizErros, camadas, camadaAtual, matriz3Omegas):
    return None

def calculaDeltas():
    return None

def atualizaPesos():
    return None